#ifndef UNIVERSAL_NODE_MANAGER_H
#define UNIVERSAL_NODE_MANAGER_H

#include <string>
#include <vector>
#include <map>
#include <memory>

// 前向声明libgit2类型
typedef struct git_repository git_repository;
typedef struct git_submodule git_submodule;

namespace unm {

// 通用节点类型
enum NodeType {
    NODE_GIT_REPO = 0,
    NODE_IPFS_CID,
    NODE_PACKAGE,
    NODE_FILE,
    NODE_SYMBOL,
    NODE_AI_MODEL
};

// 节点关系类型
enum RelationType {
    REL_DEPENDENCY = 0,     // 依赖关系
    REL_DERIVATION,         // 派生关系  
    REL_SIMILARITY,         // 相似关系
    REL_VERSION,            // 版本关系
    REL_MIRROR,             // 镜像关系
    REL_FEATURE             // 特征关系
};

// 通用节点
struct Node {
    std::string id;
    NodeType type;
    std::string uri;
    std::map<std::string, double> features;  // 特征向量
    std::map<std::string, std::string> metadata;
    
    double weight = 1.0;    // 节点权重
    double token = 0.0;     // 令牌值
};

// 节点关系
struct Relation {
    std::string source_id;
    std::string target_id; 
    RelationType type;
    double weight = 1.0;    // 关系权重
    std::map<std::string, std::string> metadata;
};

// 通用节点管理器
class UniversalNodeManager {
public:
    UniversalNodeManager();
    ~UniversalNodeManager();
    
    // 节点管理
    bool addNode(const Node& node);
    bool removeNode(const std::string& node_id);
    Node* getNode(const std::string& node_id);
    
    // 关系管理  
    bool addRelation(const Relation& relation);
    bool removeRelation(const std::string& source_id, 
                       const std::string& target_id, RelationType type);
    
    // 特征发现
    void discoverFeatures(Node& node);
    void analyzeRelations(const Node& node);
    
    // 令牌系统
    void calculateTokenWeights();
    void propagateTokens(const std::string& start_node_id, double amount);
    
    // 镜像和依赖管理
    std::vector<std::string> findOptimalMirrors(const std::string& node_id);
    std::vector<std::string> resolveDependencies(const std::string& node_id);
    
    // AI分析
    std::vector<std::string> findSimilarNodes(const std::string& node_id, 
                                             double threshold = 0.8);
    void optimizeGraphStructure();

    // 序列化
    bool saveToFile(const std::string& filename);
    bool loadFromFile(const std::string& filename);

private:
    std::map<std::string, Node> nodes_;
    std::vector<Relation> relations_;
    git_repository* repo_ = nullptr;
    
    void initializeGit();
    void extractGitFeatures(Node& node);
    void analyzeGitRelations(Node& node);
};

// Git提供者专门化
class GitNodeManager : public UniversalNodeManager {
public:
    bool addGitRepository(const std::string& path);
    bool analyzeSubmodules(const std::string& repo_path);
    std::vector<std::string> findMirrorRepositories(const std::string& repo_url);
    
private:
    static int submoduleCallback(git_submodule* sm, const char* name, void* payload);
};

} // namespace unm

#endif
